package cn.hinglo.gameclaw.client.service;

import cn.hinglo.gameclaw.client.dao.AddressDao;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.EhcacheUtil;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.bean.Address;
import cn.hutool.core.lang.Validator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @createTime: 2017/12/29
 * @author: HingLo
 * @description: 地址管理服务层
 */
@Service
@CacheConfig(cacheNames = "address")
public class AddressService {
    private final AddressDao addressDao;

    @Autowired
    public AddressService(AddressDao addressDao) {
        this.addressDao = addressDao;
    }

    /**
     * 查询地址<br>
     * 手动进行缓存管理
     *
     * @param userId 用户的唯一ID
     * @return 操作结果
     */
    public List<Address> listAddressService(String userId) {
        //先从缓存中取值
        List<Address> list = EhcacheUtil.get("address", userId);
        if (list == null) {
            //通过用户Id与使用状态的地址来查询
            Address address = new Address().setUserId(userId).setState(true);
            list = addressDao.select(address);
            if (!list.isEmpty()) {
                EhcacheUtil.put("address", userId, list);
            }
        }
        return list.isEmpty() ? null : list;
    }

    /**
     * 通过Id来查询该地址信息<br>
     * 管理员查看用户的地址
     *
     * @param id 地址编号
     * @return 操作结果
     */
    public Result findByIdAddress(String id) {
        return ResultUtils.success(addressDao.selectByPrimaryKey(id));
    }

    /**
     * 添加地址 或者更新操作
     *
     * @param address 添加的地址对象
     * @return 操作结果
     */
    @CacheEvict(key = "#address.userId")
    @Transactional(rollbackFor = RuntimeException.class)
    public boolean addAddressService(Address address) {
        //地址信息校验与处理
        address = addressValidator(address);
        //如果地址的Id是空值，则是添加地址
        return addressDao.insert(address) > 0;

    }

    /**
     * 删除地址
     *
     * @param userId 用户的唯一ID
     * @param id     地址ID
     * @return 操作结果
     */
    @CacheEvict(key = "#userId")
    public boolean deleteAddressService(String userId, Long id) {
        if (id == null) {
            return false;
        }
        //设置地址为不使用状态
        Address address = new Address().setId(id).setState(false);
        return addressDao.updateByPrimaryKeySelective(address) == 1;
    }

    /**
     * 修改地址信息
     *
     * @param address 地址信息对象
     * @param userId  用户的唯一ID
     * @return 是否修改成功
     */
    @CacheEvict(key = "#userId")
    public boolean updateAddressService(Address address, String userId) {
        if (address.getId() == null) {
            return false;
        } else {
            //地址信息校验
            address = addressValidator(address);
            //如果地址的Id已经存在，则更新该地址信息
            return addressDao.updateByPrimaryKeySelective(address) > 0;
        }

    }


    /**
     * 地址信息校验
     *
     * @param address 需要校验的地址对象
     * @return 返回校验通过且处理好的地址对象
     */
    private Address addressValidator(Address address) {
        //手机号码校验
        if (!Validator.isMobile(address.getPhone())) {
            throw new RuntimeException("手机号码格式不正确");
        }
        //邮编地址校验
        if (!Validator.isZipCode(address.getZipCode())) {
            throw new RuntimeException("邮编格式不正确");
        }
        if (address.getStatus()) {
            addressDao.updateAddressStatus(address.getUserId());
        }
        //更新时间
        address.setDate(new Date());
        //设置地址信息为使用状态
        address.setState(true);
        return address;
    }
}
